Given two words (beginWord and endWord), and a dictionary’s word list, find all shortest transformation sequence(s) from beginWord to endWord, such that:
1、Only one letter can be changed at a time
2、Each transformed word must exist in the word list. Note that beginWord is not a transformed word.
public List<List<String>> findLadders(String start, String end, List<String> wordList) { // Just means wordList, but as a set HashSet<String> dict = new HashSet<String>(wordList); List<List<String>> res = new ArrayList<List<String>>(); HashMap<String, ArrayList<String>> nodeNeighbors = new HashMap<String, ArrayList<String>>(); // Neighbor for every node HashMap<String, Integer> distance = new HashMap<String, Integer>();// Distance of every node from the start node ArrayList<String> solution = new ArrayList<String>(); dict.add(start); solution.add(start); bfs(start, end, dict, nodeNeighbors, distance); dfs(start, end, dict, nodeNeighbors, distance, solution, res); return res; }
// BFS: Trace every node's distance from the start node (level by level). privatevoidbfs(String start, String end, Set<String> dict, HashMap<String, ArrayList<String>> nodeNeighbors, HashMap<String, Integer> distance){ // 初始化已经在入口函数中完成了。 for (String str : dict) { nodeNeighbors.put(str, new ArrayList<String>()); }
Queue<String> queue = new LinkedList<String>(); queue.offer(start); distance.put(start, 0);
while (!queue.isEmpty()) { int count = queue.size(); boolean foundEnd = false; for (int i = 0; i < count; i++) { String cur = queue.poll(); int curDistance = distance.get(cur); ArrayList<String> neighbors = getNeighbors(cur, dict);
for (String neighbor : neighbors) { nodeNeighbors.get(cur).add(neighbor); if (!distance.containsKey(neighbor)) { //Check if visited distance.put(neighbor, curDistance + 1); if (end.equals(neighbor)) foundEnd = true; else queue.offer(neighbor); } } }
if (foundEnd) break; } }
// Find all next level nodes private ArrayList<String> getNeighbors(String node, Set<String> dict){ ArrayList<String> res = new ArrayList<String>(); char chs[] = node.toCharArray();
for (char ch = 'a'; ch <= 'z'; ch++) { for (int i = 0; i < chs.length; i++) { if (chs[i] == ch) continue; char old_ch = chs[i]; chs[i] = ch; if (dict.contains(String.valueOf(chs))) { res.add(String.valueOf(chs)); } chs[i] = old_ch; } } return res; }